package com.atguigu.a_poly;
/*
    多态的前提条件 :
        1. 必须有继承 / 实现 关系
        2. 有方法的重写 [动态绑定]
        3. 父引用指向子类对象 / 子引用强制接收父引用
 */
public class Demo {
    public static void main(String[] args) {
        //父引用指向子类对象
        Animal a = new Dog();

        //子引用强制接收父引用
        Dog dog = (Dog)a; //前提 : a 的本质必须是Dog对象

        System.out.println("-------------------");

        //动态绑定 : 多态场景下成员方法的访问问题
        a.eat();//狗吃骨头


        //修改a引用指向的地址
        a = new Cat();

        a.eat();//猫吃罐头

        //修改a引用指向的地址
        a = new Pig();

        a.eat();//猪吃饲料
        System.out.println("-------------------");
        //调用use
        Dog d = new Dog();
        use(d);

        Cat cat = new Cat();
        use(cat);

        Pig pig = new Pig();
        use(pig);
    }
    /*
        第一次调用 : Animal animal = d = new Dog();
     */
    public static void use(Animal animal){
        animal.eat();
    }
}

//猫狗案例
class Animal{
    public void eat(){
        System.out.println("动物吃东西 ! ");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头 ! ");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃罐头 ! ");
    }
}

class Pig extends Animal{
    @Override
    public void eat() {
        System.out.println("猪吃饲料 ! ");
    }
}